package com.qys.livesMall.app.user.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qys.livesMall.app.user.model.dto.app.*;
import com.qys.livesMall.app.user.model.dto.sys.*;
import com.qys.livesMall.app.user.model.entity.H2AppUser;
import com.qys.livesMall.app.user.model.vo.TelephoneAreaCodeVO;
import com.qys.livesMall.app.user.model.vo.app.AppUserInfoTeamDetailVo;
import com.qys.livesMall.app.user.model.vo.app.AppUserInfoVo;
import com.qys.livesMall.app.user.model.vo.app.AppUserInviteVO;
import com.qys.livesMall.app.user.model.vo.sys.NewSysAppUserVo;
import com.qys.livesMall.app.user.model.vo.sys.SysAppUserActivePageVo;
import com.qys.livesMall.app.user.model.vo.sys.SysAppUserPageVo;
import com.qys.livesMall.app.user.model.vo.sys.UserChannelListVO;
import com.qys.livesMall.finance.enums.AccountBusinessTypeEnum;
import com.qys.livesMall.framework.view.BaseQuery;
import jakarta.servlet.http.HttpServletRequest;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户 服务类
 * </p>
 *
 * @author dp
 * @since 2023-04-20
 */
public interface IH2AppUserService extends IService<H2AppUser> {

    /**
     * 用户注册
     *
     * @param userRegisterDTO
     * @param ip
     */
    void register(AppUserRegisterDTO userRegisterDTO, String ip);

    /**
     * 检验用户是否存在
     * @param userName
     * @return
     */
    boolean checkUserNameExist(String userName);

    void adds(List<H2AppUser> users, String ip);

    /**
     * 用户登录
     *
     * @param appLoginDTO
     * @param request
     */
    String login(AppLoginDTO appLoginDTO, HttpServletRequest request);

    /**
     * 退出登录
     */
    void loginOut(String token);

    /**
     * 后台管理分页查询用户信息
     *
     * @param userQueryDTO
     * @return
     */
    Page<SysAppUserPageVo> pageSys(SysAppUserQueryDTO userQueryDTO);

    /**
     * 后台新增用户信息
     *
     * @param sysAppUserSaveDTO
     */
    void save(SysAppUserSaveDTO sysAppUserSaveDTO,String ip);

    /**
     * 后台修改用户信息
     *
     * @param dto
     */
    void update(NewSysAppUserVo dto);

    String getRandomId();
    /**
     * 根据id查询用户信息
     *
     * @param id
     * @return
     */
    NewSysAppUserVo queryById(String id);

    /**
     * 置顶用户信息
     *
     * @param userId
     * @param top
     */
    void top(String userId, boolean top);

    /**
     * 将用户设置为水军
     *
     * @param userId
     */
    void waterArmy(String userId);

    /**
     * 获取用户信息
     *
     * @param userId 用户id
     * @return
     */
    AppUserInfoVo queryUserIno(Long userId);

    /**
     * 修改用户登录密码
     *
     * @param passwordDTO
     * @param userId
     */
    void changePassword(PasswordDTO passwordDTO, Long userId);

    /**
     * 设置用户密码
     *
     * @param passwordDTO
     * @param userId
     */
    void setPassword(PasswordDTO passwordDTO, Long userId);

    /**
     * 校验用户安全密码
     * @param id
     * @param password
     * @return
     */
    boolean checkUserPayPassword(String id, String password);


    /**
     * app修改用户信息
     *
     * @param editDTO
     */
    void save(AppUserEditDTO editDTO);

    /**
     * 后台管理分页查询用户信息
     *
     * @param userQueryDTO
     * @return
     */
    List<SysAppUserPageVo> listUserInfo(SysAppUserQueryDTO userQueryDTO);

    /**
     * 用户邀请记录查询
     *
     * @param baseQuery
     */
    Page<AppUserInviteVO> queryUserInviteHistory(BaseQuery baseQuery);

    /**
     * 成为店主
     * @param userId
     */
    void becomeShopkeeper(Long userId);

    /**
     * 成为主播
     * @param userId
     */
    void becomeAnchor(Long userId);

    boolean checkPassWord(Long userId, String payPassword, int type);

    Map<String,String> loginByGoogle(String code, HttpServletRequest request);

    H2AppUser getbyUserName(String userName);

    List<H2AppUser> getbyUserNameLike(String userName, Integer userType);

    H2AppUser userSuperiorInfo(String inviteCode);

    List<H2AppUser> getYesterday();

    Integer getbyLastLoginTime(SysHomeStatisticsDTO dto);

    Integer getTodayPeopleNumber(Integer userSysType);

    List<UserChannelListVO> channelList();

    void addChannel(SysAppUserSaveDTO sysAppUserSaveDTO);

    List<H2AppUser> userAll();

    List<Long> getsubset(Long oldUserId);

    List<Long> getChildUserIds(List<Long> list);

    /**
     * 根据用户ID查询和 条件查询  子ID集合
     * @param userId
     * @param conditionType
     * @param conditionCode
     * @return
     */
    List<String> gettreeList(String userId, Integer conditionType, Integer conditionCode);

    /**
     * 根据用户ID查询 查询用户子ID集合
     * @param userId 指定用户
     * @param conditionCode  1 真实用户 2 状态正常 3 充值用户
     * @return
     */
    List<String> gettreeList(String userId, Integer conditionCode);

    /**
     * 电话区号
     * @return
     */
    List<TelephoneAreaCodeVO> getInternationalTelephoneAreaCode();

    /**
     * 同ip查询活跃人数
     */
    Integer getActivebyLastLoginTime(String ip);

    List<H2AppUser> getActivebyLastLogin();

    Page<SysAppUserPageVo> foundationpage(SysAppUserQueryDTO userQueryDTO);

    List<AppUserInfoTeamDetailVo> getbyUserids(Page<AppUserInfoTeamDetailVo> page,List<Long> list);

    Map<String, String> facebookLogin(String userId, String userToken, HttpServletRequest request);

    List<String> getsubsetList(String id);

    boolean userIsNavy(String userId);

    Page<SysAppUserActivePageVo> activeUserPage(BaseQuery baseQuery);

    /**
     *
     * @param query
     * @return  如果为null则未执行查询
     */
    List<Long> getUserIdByQuery(UserQuery query);

    /**
     * 邀请奖励
     * @param userid 充值用户
     */
    void InvitationRewards(Long userid);

    /**
     * 奖励转账
     * @param userid
     * @param accountBusinessTypeEnum
     * @param rewards
     * @param id
     * @return
     */
    Boolean transferAccounts(Long userid, AccountBusinessTypeEnum accountBusinessTypeEnum, BigDecimal rewards, Long id);

    /**
     * 更新用户活跃
     * @param userId
     */
    void activeUser(Long userId);

    List<H2AppUser> getUserOtherInfoByIds(List<String> userIds);

    void userBindingPhone(AppUserRegisterPhoneDTO dto);

    void userBindingMail(AppUserRegisterMailDTO dto);

    boolean sendMail(String mailNumber, String mailuserregister);

    List<H2AppUser> getWeek();

    H2AppUser getUserByRandomId(String superior);

    /**
     * 修改用户信息
     * @param dto
     */
    void editUser(EditSysAppUserDTO dto);
}
